package com.udc.medLine.transaction;

import java.util.Date;
import java.util.List;

import com.udc.medLine.entity.Cliente;
import com.udc.medLine.entity.CondicaoVO;
import com.udc.medLine.entity.Conveniencia;
import com.udc.medLine.entity.Item;
import com.udc.medLine.entity.ItemVenda;
import com.udc.medLine.entity.Marca;
import com.udc.medLine.entity.Medicamento;
import com.udc.medLine.entity.Produto;
import com.udc.medLine.entity.Status;
import com.udc.medLine.entity.Venda;
import com.udc.medLine.exception.QuantidadeInsuficienteException;
import com.udc.medLine.factory.FactoryCliente;
import com.udc.medLine.factory.FactoryConveniencia;
import com.udc.medLine.factory.FactoryItem;
import com.udc.medLine.factory.FactoryItemVenda;
import com.udc.medLine.factory.FactoryMarca;
import com.udc.medLine.factory.FactoryMedicamento;
import com.udc.medLine.factory.FactoryStatus;
import com.udc.medLine.factory.FactoryVenda;
import com.udc.medLine.persistence.Bd;

public class TransactionVenda {

	private Venda venda;
	private Cliente cliente;
	private Status status;
	private List listVenda;
	private List listCliente;
	private List listStatus;
	private Bd banco;

	/**
	 * 
	 */
	public TransactionVenda() {
		super();
		venda = new Venda();
		cliente = new Cliente();
		status = new Status();
		try {
			banco = Bd.getInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	public Venda getVenda() {
		return venda;
	}

	public void setVenda(Venda new_venda) {
		this.venda = new_venda;
	}

	public void remover(Venda nVenda) throws Exception {
		banco.beginTransaction();
		FactoryVenda factory = new FactoryVenda();

		venda.setId(nVenda.getId());
		factory.setVenda(venda);
		factory.delete();
		banco.commit();
	}

	public void inserir(Venda nVenda) throws Exception {
		banco.beginTransaction();
		FactoryVenda factory = new FactoryVenda();
		FactoryCliente factoryCliente = new FactoryCliente();
		FactoryStatus factoryStatus = new FactoryStatus();
		FactoryItemVenda factoryItemVenda = new FactoryItemVenda();
		int qtdPedido;
		float valor;
		
		cliente.setId(nVenda.getCliente().getId());
		factoryCliente.setCliente(cliente);
		cliente = factoryCliente.obterCliente();
		
		status.setId(nVenda.getStatus().getId());
		factoryStatus.setStatus(status);
		status = factoryStatus.obterStatus();
		
		venda.setData(nVenda.getData());
		venda.setTotal(nVenda.getTotal());
		venda.setStatus(status);
		venda.setCliente(cliente);
		
		factory.setVenda(venda);
		factory.insert();
		
		venda.setItens(nVenda.getItens());

		for (ItemVenda itemVenda : venda.getItens()) {
			
			FactoryItem factoryItem = new FactoryItem();
			Item item = new Item();

			if (itemVenda.getItem().getTipoItem().getNome().equals(	Produto.CONVENIENCIA)) {

				FactoryConveniencia factoryConveniencia = new FactoryConveniencia();
				
				Conveniencia conveniencia = new Conveniencia();
				
				int qtdEstoque = itemVenda.getItem().getConveniencia().getQuantidade();

				qtdPedido = itemVenda.getQuantidade();
				
				 valor = itemVenda.getPreco();

				int id = itemVenda.getItem().getConveniencia().getId();

				if (qtdEstoque < qtdPedido) {

					throw new QuantidadeInsuficienteException(itemVenda.getItem()
							.getConveniencia().getNome());

				}				
				conveniencia.setId(id);
				factoryConveniencia.setConveniencia(conveniencia);
				conveniencia = factoryConveniencia.obterConveniencia();

				conveniencia.setQuantidade(qtdEstoque - qtdPedido);

				factoryConveniencia.setConveniencia(conveniencia);
				
				factoryConveniencia.update();
				
				item.setConveniencia(conveniencia);
				item.setTipoItem(itemVenda.getItem().getTipoItem());
				item.setMedicamento(null);
				
				factoryItem.setItem(item);
				factoryItem.insert();

			} else {

				FactoryMedicamento factoryMedicamento = new FactoryMedicamento();
				
				Medicamento medicamento = new Medicamento();
				
				int qtdEstoque = itemVenda.getItem().getMedicamento().getQuantidade();

				qtdPedido = itemVenda.getQuantidade();
				
				valor = itemVenda.getPreco();

				int id = itemVenda.getItem().getMedicamento().getId();

				if (qtdEstoque < qtdPedido) {

					throw new QuantidadeInsuficienteException(itemVenda.getItem()
							.getMedicamento().getNome());

				}				
				medicamento.setId(id);
				factoryMedicamento.setMedicamento(medicamento);
				medicamento = factoryMedicamento.obterMedicamento();

				medicamento.setQuantidade(qtdEstoque - qtdPedido);

				factoryMedicamento.setMedicamento(medicamento);
				
				factoryMedicamento.update();
				
				item.setMedicamento(medicamento);
				
				item.setTipoItem(itemVenda.getItem().getTipoItem());
				
				item.setConveniencia(null);
				
				factoryItem.setItem(item);
				factoryItem.insert();

			}
			
			itemVenda.setVenda(venda);
			itemVenda.setItem(item);
			itemVenda.setQuantidade(qtdPedido);
			itemVenda.setPreco(valor);
			factoryItemVenda.setItemVenda(itemVenda);
			factoryItemVenda.insert();
		}
		banco.commit();
	}

	public void atualizar(Venda nVenda) throws Exception {
		banco.beginTransaction();
		FactoryVenda factory = new FactoryVenda();
		FactoryStatus factoryStatus = new FactoryStatus();
		
		
		venda.setId(nVenda.getId());
		factory.setVenda(venda);
		venda = factory.obterVenda();
		
		status.setId(nVenda.getStatus().getId());
		factoryStatus.setStatus(status);		
		status = factoryStatus.obterStatus();
		
		venda.setStatus(status);
		venda.setData(new Date());
		factory.setVenda(venda);
		factory.update();
		
		banco.commit();
	}

	public void obterListaVenda(String campo, String valor) throws Exception {
		banco.beginTransaction();
		FactoryVenda factory = new FactoryVenda();
		factory.setVenda(new Venda());
		listVenda = factory.getVenda(campo, valor);
		banco.commit();
	}

	public void obterListaVenda() throws Exception {
		banco.beginTransaction();
		FactoryVenda factory = new FactoryVenda();
		factory.setVenda(new Venda());
		listVenda = factory.getListaVenda();
		banco.commit();
	}

	public void obterVenda(Venda nVenda) throws Exception {
		banco.beginTransaction();
		FactoryVenda factory = new FactoryVenda();
		FactoryItemVenda factoryItemVenda = new FactoryItemVenda();		
		CondicaoVO condicao = new CondicaoVO();
		venda.setId(nVenda.getId());
		factory.setVenda(venda);
		venda = factory.obterVenda();
		condicao.setCampo("venda");
		condicao.setOperador("igual");
		condicao.setValor(venda.getId()+"");
		venda.setItens(factoryItemVenda.search(condicao));		
		banco.commit();
	}

	public void obterListaCliente() throws Exception {
		banco.beginTransaction();
		FactoryCliente factory = new FactoryCliente();
		listCliente = factory.getListaClientes();
		banco.commit();
	}

	public void obterListaStatus() throws Exception {
		banco.beginTransaction();
		FactoryStatus factory = new FactoryStatus();
		listStatus = factory.getListaStatus();
		banco.commit();
	}

	/**
	 * @return
	 */
	public List getListVenda() {
		return listVenda;
	}

	/**
	 * @param list
	 */
	public void setListVenda(List list) {
		listVenda = list;
	}

	/**
	 * @return
	 */
	public Cliente getCliente() {
		return cliente;
	}

	/**
	 * @param cliente
	 */
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	/**
	 * @return Returns the listCliente.
	 */
	public List getListCliente() {
		return listCliente;
	}

	/**
	 * @param listCliente
	 *            The listCliente to set.
	 */
	public void setListCliente(List listCliente) {
		this.listCliente = listCliente;
	}

	/**
	 * @return the status
	 */
	public Status getStatus() {
		return status;
	}

	/**
	 * @param status
	 *            the status to set
	 */
	public void setStatus(Status status) {
		this.status = status;
	}

	/**
	 * @return the listStatus
	 */
	public List getListStatus() {
		return listStatus;
	}

	/**
	 * @param listStatus
	 *            the listStatus to set
	 */
	public void setListStatus(List listStatus) {
		this.listStatus = listStatus;
	}

	public List<Venda> search(CondicaoVO condicao) throws Exception {
		banco.beginTransaction();
		FactoryVenda factory = new FactoryVenda();
		listVenda = factory.search(condicao);
		banco.commit();
		return listVenda;
	}

	public List search(List condicoes) throws Exception {
		banco.beginTransaction();
		FactoryVenda factory = new FactoryVenda();
		factory.setVenda(new Venda());
		listVenda = factory.search(condicoes);
		banco.commit();
		return listVenda;
	}
}
